home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / ecc-121.lha / ecc-1.2.1 / ecc.c < prev    next >
C/C++ Source or Header  |  1993-01-19  |  3KB  |  138 lines

  1. /*
  2.     ecc Version 1.2  by Paul Flaherty (paulf@stanford.edu)
  3.     Copyright (C) 1993 Free Software Foundation, Inc.
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2, or (at your option)
  8.     any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20.  
  21. /* ecc.c
  22.     Basic Software Tool for Encoding and Decoding Files.
  23.  
  24.     This is a simple stream encoder which uses the rslib routines to
  25.     do something practical.  It reads data from stdin in 248(encode) or
  26.     256(decode) blocks, and writes the corresponding encoded/decoded
  27.     block onto stdout.  An encoded block contains 248 data bytes, one
  28.     length byte, six redundancy bytes, and a capital G byte as a sync
  29.     marker to round it out to 256 bytes.
  30. */
  31.  
  32. #include <stdio.h>
  33. #include <sys/types.h>
  34.  
  35. main (argc, argv)
  36.  
  37.      int argc;
  38.      char *argv[];
  39.  
  40. {
  41.  
  42.   int ec;
  43.  
  44.   if (argc != 2)
  45.     {
  46.       fprintf (stderr, "usage: ecc [-edv] \n");
  47.       exit (1);
  48.     }
  49.  
  50.   if (strcmp ("-e", argv[1]) == 0)
  51.     encode ();
  52.   if (strcmp ("-d", argv[1]) == 0)
  53.     decode ();
  54.   if (strcmp ("-v", argv[1]) == 0)
  55.     ver ();
  56.  
  57.   fprintf (stderr, "usage: ecc [-edv] \n");
  58.   exit (1);
  59.  
  60. }
  61.  
  62. ver ()
  63.  
  64. {
  65.   extern char version[];
  66.  
  67.   fprintf (stderr, "%s\n", version);
  68.   exit (0);
  69.  
  70. }
  71.  
  72. encode ()
  73.  
  74. {
  75.  
  76.   unsigned char msg[249], coded[255];
  77.   int i, readme;
  78.  
  79.   for (i = 0; i < 249; i++)
  80.     msg[i] = 0;
  81.  
  82.   readme = 248;
  83.  
  84.   while (readme == 248)
  85.     {
  86.       readme = fread (msg, 1, 248, stdin);
  87.       msg[248] = readme;
  88.  
  89.       rsencode (msg, coded);
  90.  
  91.       fprintf (stdout, "G");
  92.       for (i = 254; i > -1; i--)
  93.     fprintf (stdout, "%c", coded[i]);
  94.     }
  95.  
  96.   exit (0);
  97.  
  98. }
  99.  
  100.  
  101.  
  102. decode ()
  103.  
  104. {
  105.  
  106.   int i, j, readme, bo, len;
  107.   unsigned char msgs[249], cod[255];
  108.  
  109.   j = 0;
  110.  
  111.   while (getc (stdin) == 71)
  112.     {
  113.       j++;
  114.       for (i = 254; i > -1; i--)
  115.     cod[i] = getc (stdin);
  116.  
  117.       rsdecode (cod, msgs, &bo);
  118.  
  119.       if (bo > 0 && bo < 4)
  120.     fprintf (stderr, "ecc: %d byte error in block %d.\n", bo, j);
  121.  
  122.       if (bo == 4)
  123.     fprintf (stderr, "ecc: unrecoverable error in block %d.\n", j);
  124.       len = msgs[248];
  125.       for (i = 0; i < len; i++)
  126.     putc (msgs[i], stdout);
  127.     }
  128.  
  129.   if (getc (stdin) != EOF)
  130.     {
  131.       fprintf (stderr, "ecc: sync error in block %d.\n", j);
  132.       exit (1);
  133.     }
  134.  
  135.   exit (0);
  136.  
  137. }
  138.